package zw_501_600.zw_557_反转字符串中的单词III;

class Solution {

    public static void main(String[] args) {
        String s = "Let's take LeetCode contest";
        String words = reverseWords(s);
        System.out.println(words);
    }

    /**
     * 另外一种方法就是不借助StringBuilder，直接操作字符数组，把String转为字符数组，原地操作，然后再把字符数组转成String返回。
     * 用双指针指向原数组中的单词首尾，进行反转，然后向前步进到下一个单词。
     *
     * @param s
     * @return
     */
    public static String reverseWords(String s) {
        char[] chars = s.toCharArray();
        for (int i = 0, j = 0; i <= chars.length; i++) {
            if (i == chars.length || chars[i] == ' ') {
                int k = i - 1;
                while (j < k) {
                    char t = chars[k];
                    chars[k] = chars[j];
                    chars[j] = t;
                    j++;
                    k--;
                }
                j = i + 1;
            }
        }
        return new String(chars);
    }


    /**
     * 借助StringBuilder的插入功能，可以让一个指针指向空格的下一个索引，然后不断向此位置插入新字符，
     * 因为插入的位置不变，所以最终一个单词的字符就是倒着的，每当遇到空格就更新左指针。
     * @param s
     * @return
     */
//    public static String reverseWords(String s) {
//        StringBuilder sb = new StringBuilder();
//        for (int i = 0, j = 0; i < s.length(); i++) {
//            char ch = s.charAt(i);
//            if (ch != ' ') {
//                sb.insert(j, ch);
//            } else {
//                j = i + 1;
//                sb.append(ch);
//            }
//        }
//
//        return sb.toString();
//    }
}